以下參考課程 LLM Twin: Building Your Production-Ready AI Replica 撰寫
在前幾篇文章中,我們探討了如何透過 Change Data Capture (CDC) 實踐 RAG 中爬蟲資料庫與向量資料庫的同步,並介紹如何利用 MongoDB 和 RabbitMQ 實現一個完整的 CDC 系統,目前系統流程如下:
watch()
) 捕捉資料變更。今天,我們將進一步深入,介紹如何通過 Docker-compose 在本地開發環境中進行測試,最終部署到雲端,以及可以透過哪些雲端工具擴展我們的服務。
在本地環境中,我們將使用 Docker-Compose 來同時運行 MongoDB 複製集和 RabbitMQ 消息代理,以便開發和測試,而無需在本機安裝和配置複雜的服務。
在 docker-compose.yml
中,我們設置了三個 MongoDB 實例來組成複製集,並配置了每個實例的容器名稱、端口和實例的健康檢查:
services:
mongo1:
image: mongo:5
container_name: mongo1
command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30001"]
volumes:
- ./data/mongo-1:/data/db
ports:
- 30001:30001
healthcheck:
test: test $$(echo "rs.initiate({_id:'my-replica-set',members:[{_id:0,host:\"mongo1:30001\"},{_id:1,host:\"mongo2:30002\"},{_id:2,host:\"mongo3:30003\"}]}).ok || rs.status().ok" | mongo --port 30001 --quiet) -eq 1
interval: 10s
start_period: 30s
mongo2:
# Similar configuration as mongo1, but with port 30002
mongo3:
# Similar configuration as mongo1, but with port 30003
mq:
# introduce in the next part
這樣的設置確保了 MongoDB 複製集能夠在容器啟動時自動初始化,並進行健康檢查來保證系統的穩定性。使用複製集的好處包括:
我們繼續編寫 docker-compose.yml
,設置 RabbitMQ 消息代理。這裡使用 rabbitmq:3-management-alpine
映像,並開啟管理插件來方便我們查看隊列狀態和消息流動。
services:
# 上述 mongoDB 的配置,此處省略
mq:
image: rabbitmq:3-management-alpine
container_name: scrabble_mq
ports:
- "5673:5672"
- "15673:15672"
volumes:
- ~/rabbitmq/data/:/var/lib/rabbitmq/
- ~/rabbitmq/log/:/var/log/rabbitmq
restart: always
這樣的設置將 RabbitMQ 的管理界面暴露在 15673 端口上,方便通過瀏覽器進行管理。在這裡回顧 RabbitMQ 的的主要功用:
為了簡化測試和開發過程,我們創建了一個 Makefile,定義了常用的操作指令:
local-start: # Build and start mongodb and mq.
docker-compose -f docker-compose.yml up --build -d
local-start-cdc: # Start CDC system
python cdc.py
local-test-cdc: # Test CDC system by inserting data to mongodb
python test_cdc.py
這個 Makefile 定義了三個主要任務,每個任務都有其用途:
local-start
: 構建並啟動 MongoDB 和 RabbitMQ 服務。local-start-cdc
: 啟動 CDC 系統。local-test-cdc
: 通過向 MongoDB 插入資料來測試 CDC 系統。首先,使用以下命令來啟動 MongoDB 和 RabbitMQ 容器:
make local-start
這個命令會根據 docker-compose.yml
文件啟動所有服務,接著可以使用前幾天介紹的 docker ps
檢查服務狀態,確保所有容器都正常運作。
接下來,使用以下命令啟動 CDC 系統:
make local-start-cdc
這個命令會執行 cdc.py
腳本,該腳本會監控 MongoDB 的數據變更,並將變更格式化後發送至 RabbitMQ。
最後,我們使用測試腳本在 mongoDB 中插入資料,以觸發 CDC 系統:
make local-test-cdc
當 CDC 系統捕捉到變更時,日誌中會顯示如下輸出:
2024-04-05 04:43:51,510 - INFO - Change detected and serialized: {"name": "LLM TWIN", "type": "test", "entry_id": "660f5757b3153bbb219fd901"}
2024-04-05 04:43:51,534 - INFO - Data published to RabbitMQ.
在將本地 CDC 系統遷移到雲端環境時,我們需要充分利用雲服務提供的優勢,以實現系統的高可擴展性和可用性。以下是基於 AWS 服務的系統架構和關鍵組件選擇:
系統層 | 功能描述 | 核心工具 | 優勢 |
---|---|---|---|
內容抓取層 | 運行爬蟲和處理器腳本 | AWS Lambda | 無伺服器、按需擴展、成本效益高 |
數據存儲層 | 存儲爬取的內容 | Amazon DocumentDB | 完全托管、MongoDB 兼容、高可用性 |
變更捕獲層 | 運行 CDC 腳本 | AWS Fargate | 容器化部署、自動擴展、資源隔離 |
消息代理層 | 處理消息傳遞 | Amazon MQ | 托管 RabbitMQ 服務、高可用性、易於集成 |
處理和分析層 | 進行後續的數據處理和分析 | AWS Lambda | 事件驅動、無伺服器、彈性擴展 |
輔助功能 | 工具 | 用途 |
---|---|---|
負載均衡和流量管理 | Amazon ELB (Elastic Load Balancing) | 分配流量、提高可用性 |
自動擴展 | AWS Auto Scaling | 自動調整資源以應對負載變化 |
監控和日誌 | Amazon CloudWatch | 性能監控、日誌管理、警報設置 |
安全和訪問控制 | AWS IAM, VPC, Security Groups | 身份驗證、授權、網絡隔離 |
CI/CD | GitHub Actions, AWS CodePipeline | 自動化測試、構建和部署流程 |
基礎設施即代碼(IaC) | AWS CloudFormation 或 Terraform | 自動化和版本控制基礎設施配置 |
緩存 | Amazon ElastiCache | 提高數據訪問速度、減輕數據庫負載 |
實時數據處理 | Amazon Kinesis | 處理大規模實時數據流 |
成本管理 | AWS Cost Explorer, AWS Budgets | 成本分析、預算設置、優化支出 |
分佈式追蹤 | AWS X-Ray | 診斷性能問題、分析服務依賴 |
ref.